Fetch audit logs
Fetches tenant-level audit log entries using a stateless cursor-based approach. Designed for clients that need to continuously stream or replay audit activity without missing or duplicating records.
Call patterns
Initial call (no cursor)
Omit the cursor field and supply optional filters. The server freezes those filters into an opaque cursor token returned as nextCursor.
- Open-tail stream (
createdAfteronly, nocreatedBefore): each subsequent poll advances the upper bound forward in real time, delivering new events as they are committed. The window fromcreatedAftertonowmust not exceed 90 days at the time of the initial call. - Fixed window (
createdAfter+createdBefore): the cursor exhausts once all matching rows in the range have been delivered (hasMore: false). - Start from now (neither date supplied): stream begins at the current time, delivering only events that occur going forward.
Subsequent calls (with cursor)
Pass only the cursor field from the previous response's nextCursor. Do not include any filters or dates — they are already frozen inside the cursor. To change filters, start a new stream by making a fresh initial call without a cursor.
Polling
hasMore: true— a full page was returned; call again immediately withnextCursorto retrieve the next page.hasMore: false— the stream is caught up; wait before polling again, then retry withnextCursor.- Always preserve
nextCursor, even whendatais empty. Discarding it loses your position in the stream.
Date rules
- Accepted format: ISO 8601 with explicit UTC offset, e.g.
2026-06-01T00:00:00Z. createdAftercannot be in the future.createdAftercannot be older than 1 year (the audit log retention window).createdBeforerequirescreatedAfter. IfcreatedBeforeis in the future it is silently clamped tonow.createdBeforemust be aftercreatedAfter(after clamping).- The window between
createdAfterandcreatedBefore(ornowfor open tails) must not exceed 90 days.
Ordering and safe upper bound
Results are returned in ascending order by event ID (i.e. chronological order). A 5-second lag is applied to the upper time bound so that in-flight transactions have time to commit before the cursor reaches them, preventing gaps in the stream.
Headers
| Header | Value |
|---|---|
user_id | Login username (email) |
api_key | API key of the user for authentication |
Content-Type | application/json |
Accept | application/json |
Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
accelqLoginUrl | string | Yes | The AccelQ login URL for API access. |
tenantCode | string | Yes | Tenant code for identifying the organization. |
user_id | string | Yes | Login username (email) |
api_key | string | Yes | API key of the user for authentication |
Request Body
{}
Responses
200 - A page of audit log entries with cursor state.
{
"data": [
{
"eventId": 1035,
"actor": {
"id": 3,
"email": "admin@example.com",
"displayName": "John Doe"
},
"event": "Create User",
"description": "User created: jane@example.com",
"timestamp": "2026-01-15T08:12:04Z"
},
{
"eventId": 1042,
"actor": {
"id": 3,
"email": "admin@example.com",
"displayName": "John Doe"
},
"event": "Create Project",
"description": "Project created: Regression Suite",
"timestamp": "2026-01-15T10:30:00Z"
}
],
"nextCursor": "eyJ2IjoxLCJsYXN0SWQiOjEwNDIsImZyb21FcG9jaE1zIjoxNzQ4NzM5MjAwMDAwLCJ0b0Vwb2NoTXMiOm51bGx9",
"hasMore": true
}
400 - Bad Request — invalid filter value or constraint violation.
{
"error": "Do not send filters or dates with a cursor. To change filters, start a new sync without a cursor."
}
403 - Forbidden — caller does not have Tenant Admin privileges.
{
"error": "User do not have authorization to access this feature."
}
500 - Internal Server Error
No response sample available
cURL Command Builder
URL Parameters
Headers
Request Sample (cURL)
curl -X POST "${{accelqLoginUrl}}/awb/api/2.0/${{tenantCode}}/administration/audit-logs" \
-H "user_id: ${{user_id}}" \
-H "api_key: ${{api_key}}" \
-H "Content-Type: application/json" \
-H "Accept: application/json" \
-d '{}'